package cn.chenc.framework.mybatisplus.util;

import cn.chenc.framework.mybatisplus.model.BaseEntity;
import cn.chenc.framework.mybatisplus.xss.SqlFilter;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.commons.lang3.StringUtils;

/**
 * @Author Xjt
 * @Date 2021/2/26 20:43
 * @Version 1.0
 */
public class Query<T> {
    /**
     * 升序
     */
    public static final String ASC = "asc";

    /**
     * 获取 IPage 分页对象
     * @param params 参数
     * @return 分页对象
     */
    public IPage<T> getPage(BaseEntity params) {
        return this.getPage(params, null, null);
    }

    /**
     * 获取 IPage 分页对象
     * @param params 参数
     * @param defaultOrderField 排序字段
     * @param isAsc 是否升序（指定排序字段有效）
     * @return 分页对象
     */
    public IPage<T> getPage(BaseEntity params, String defaultOrderField, Boolean isAsc) {
        // 分页参数
        int pageIndex = 1;
        int pageSize = 10;

        if (params.getPageIndex() != 0) {
            pageIndex = params.getPageIndex();
        }
        if (params.getPageSize() != 0) {
            pageSize = params.getPageSize();
        }

        Page<T> page = new Page<>(pageIndex, pageSize);

        // 排序字段，防止 SQL 注入
        String orderField = SqlFilter.sqlInject((String) params.getOrderField());
        String order = (String) params.getOrderDirection();

        // 前段字段排序
        if (StringUtils.isNotEmpty(orderField) && StringUtils.isNotEmpty(order)) {
            if (ASC.equalsIgnoreCase(order)) {
                page.addOrder(OrderItem.asc(orderField));
            }else {
                page.addOrder(OrderItem.desc(orderField));
            }
        }

        if (StringUtils.isBlank(defaultOrderField)) {
            return page;
        }

        if (isAsc) {
            page.addOrder(OrderItem.asc(defaultOrderField));
        }else {
            page.addOrder(OrderItem.desc(defaultOrderField));
        }
        return page;
    }
}
